package com.jml;


import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * @author:jml
 * @date: 2019/11/25 16:40
 * @description：
 */
public class FunctionTest2 {
	
	public static void main(String[] args) {
		FunctionTest2 test = new FunctionTest2();
		
		
		
		
		
		
		int compute = test.compute(2, value -> {return value * 3;}, value -> value * value);
		System.out.println(compute);
		
		int compute2 = test.compute2(2, value -> value * 3        , value -> {return  value * value;});
		System.out.println(compute2);
		
		boolean test1 = Predicate.isEqual("a").test("b");
		boolean test2 = Predicate.isEqual("a").test("a");
		System.out.println(test1);
		System.out.println(test2);
		List<Integer> list = new ArrayList<>();
		list.add(1);
		test.conditionFilter2(list, item -> item > 5, item -> item % 2 == 0);
	}
	
	//先计算function2，得到的结果作为function1的参数，再计算function1
	//function2就是 value * value  然后再把  value * value再作为function1的参数
	//function1就是 value * 3  ，value被替换后就是(value * value)*3 所以是12
	//先是2*2  然后是 4*3
	public  int compute(int a , Function<Integer,Integer> function1, Function<Integer,Integer> function2){
		Function<Integer, Integer> compose = function1.compose(function2);
		return compose.apply(a);//.apply(a);
		//return function1.compose(function2).apply(a);
	}
	
	//先执行本函数的apply方法，得到的结果作为function2得参数，然后再执行function2的apply方法
	//先是执行function1的实现2*3然后把结果作为function2得参数，再实现function2，所以就是2*3的平方   就是36
	public  int compute2(int a ,Function<Integer,Integer> function1, Function<Integer,Integer> function2){
		return function1.andThen(function2).apply(a);
	}
	
 
	
	public void conditionFilter2(List<Integer> list, Predicate<Integer> predicate,
			Predicate<Integer> predicate2) {
		
		
		//!(大于5&&为偶数)
		for(Integer integer : list) {
			if(predicate.and(predicate2).negate().test(integer)) {
				System.out.println(integer);
			}
		}
		
		//大于5 && 为偶数
		for(Integer integer : list) {
			if(predicate.and(predicate2).test(integer)) {
				System.out.println(integer);
			}
		}
	}
	
}
